﻿// ===============================================================================
// 浪潮GSP平台
// 数据表类
// 请查看《GSP7-数据访问引擎子系统概要设计说明书》来了解关于此类的更多信息。
// ===============================================================================
// 变更历史纪录
// 时间			             版本	    修改人	        描述
// 2013/1/30 18:40:56        1.0        周国庆          初稿。
// 2013/1/31 15:24:00        1.1        周国庆           完成初稿
// ===============================================================================
// 开发者: 周国庆
// 2013/1/30 18:40:56 
// (C) 2013 Genersoft Corporation 版权所有
// 保留所有权利。
// ===============================================================================

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Xml;

namespace T.FAS.Runtime.DataAccess.SQLDom
{
    /// <summary>
    /// 数据表类
    /// </summary>
    /// <remarks>数据表</remarks>
    [Serializable]
    public class SqlTable : SqlElement
    {
        #region 字段

        /// <summary>
        /// 是否使用别名
        /// </summary>
        private bool isUseAlias = false;

        /// <summary>
        /// 表别名
        /// </summary>
        private string tableAlias;

        #endregion

        #region 构造函数

        #endregion

        #region 属性

        /// <summary>
        /// 表名称
        /// </summary>
        public string TableName { get; set; }

        /// <summary>
        /// 是否使用别名
        /// </summary>
        public bool IsUseAlias
        {
            get { return isUseAlias; }
        }

        /// <summary>
        /// 表别名
        /// </summary>
        public string TableAlias
        {
            get
            {
                string result;
                if (string.IsNullOrEmpty(tableAlias))
                    result = RealTableName;
                else
                    result = tableAlias;
                if (FieldNameWraps != null)
                    return FieldNameWraps(result);
                else
                    return result;
            }
            set
            {
                tableAlias = value;
                isUseAlias = true;
            }
        }

        private string realTableName;
        /// <summary>
        /// 真实的表名
        /// </summary>
        /// <remarks>处理年度表、模块表等需求</remarks>
        public string RealTableName
        {
            get
            {
                if (string.IsNullOrEmpty(realTableName))
                    return TableName;
                else
                    return realTableName;
            }
            set
            {
                realTableName = value;
            }
        }

        /// <summary>
        /// 表名前缀
        /// </summary>
        /// <remarks>用于字段上的表名前缀</remarks>
        public string TablePrefix
        {
            get 
            {
                var tbPrefix = IsUseAlias ? TableAlias : TableName;
                if (FieldNameWraps != null)
                    return FieldNameWraps(tbPrefix);
                return tbPrefix;
            }
        }

        //包裹列名的方法
        public Func<string, string> FieldNameWraps { get; set; }
        #endregion

        #region 方法

        /// <summary>
        /// 构造函数
        /// </summary>
        public SqlTable()
            : base()
        { }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="tableName">表名称</param>
        /// <param name="tableAlias">表别名</param>
        /// <param name="realTableName">实表名称</param>
        public SqlTable(string tableName, string tableAlias = "", string realTableName = "")
            : this()
        {
            TableName = tableName;
            if (string.IsNullOrEmpty(tableAlias) == false)
                TableAlias = tableAlias;
            RealTableName = realTableName;
        }

        /// <summary>
        /// 转换成SQL
        /// </summary>
        /// <returns>SQL</returns>
        public override string ToSQL()
        {
            this.RealTableName = string.IsNullOrEmpty(this.RealTableName) ? this.TableName : this.RealTableName;
            var realTableName = this.RealTableName;
            var tableAlias = this.TableAlias;
            if (FieldNameWraps != null)
            {
                realTableName = FieldNameWraps(realTableName);
                tableAlias = FieldNameWraps(tableAlias);
            }
            if (!string.IsNullOrEmpty(TableAlias) && !string.Equals(TableAlias, RealTableName, StringComparison.OrdinalIgnoreCase))
            {
                return string.Format("{0} {1}", realTableName, tableAlias);
            }

            return realTableName;
        }     

        #endregion
    }
}